home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
-
- /*
- $Header: b1mem.c,v 1.4 85/08/27 10:55:51 timo Exp $
- */
-
- /* B memory management */
-
- #include "b.h"
- #include "b1obj.h"
- #include "b1mem.h"
- #include "b3err.h" /* For still_ok */
-
- #ifdef IBMPC
- #define RESERVE
- #endif
-
- #ifdef RESERVE
- Forward char *mymalloc(), *myrealloc();
- #else
- #define mymalloc malloc
- #define myrealloc realloc
- #define initreserve() 0 /* Dummy routine */
- #endif
-
- #ifdef ebug
-
- Hidden value notel, inotel;
- Visible bool noting= Yes;
-
- Hidden Procedure note(p) int p; {
- if (!noting) {
- value ip;
- noting= Yes;
- insert(ip= mk_integer(p), ¬el);
- release(ip);
- noting= No;
- }
- }
-
- Hidden Procedure denote(p) int p; {
- if (!noting) {
- value ip;
- noting= Yes;
- if (in(ip= mk_integer(p), notel)) {
- remove(ip, ¬el);
- if (inotel != Vnil && in(ip, inotel))
- remove(ip, &inotel);
- }
- #ifndef IBMPC
- else syserr(MESS(600, "releasing illegally"));
- #endif
- release(ip);
- noting= No;
- }
- }
-
- Visible Procedure initmem() {
- notel= mk_elt(); noting= No;
- initreserve();
- }
-
- Visible Procedure end_init() {
- noting= Yes;
- inotel= copy(notel);
- noting= No;
- }
-
- Visible Procedure term_mem() {
- int l, i; value v;
- testing= noting= Yes;
- l= length(notel);
- if (l>length(inotel)) fprintf(stdout, "Unreleased:\n");
- for(i=1; i<=l; i++) {
- v= thof(i, notel);
- if (!in(v, inotel))
- { wri((value) intval(v), No, No, No); newline(); }
- }
- }
-
- Visible Procedure endmem() {
- release(inotel); inotel= Vnil;
- release(notel); notel= Vnil;
- }
-
- #else !ebug
-
- #define note(p)
- #define denote(p)
-
- Visible Procedure initmem()
- {
- initreserve();
- }
-
- Visible Procedure end_init() {}
- Visible Procedure term_mem() {}
- Visible Procedure endmem() {}
-
- #endif ebug
-
- #define Negative MESS(601, "creating value of exceedingly large size")
-
- Visible ptr getmem(syze) unsigned syze; {
- ptr p;
- if ((int) (syze) < 0) error(Negative);
- p= (ptr) mymalloc(syze);
- note(p);
- if (bugs || p==Nil) printf("{%u}",syze);
- if (p == Nil) memexh();
- return p;
- }
-
- Visible Procedure regetmem(v, syze) ptr *v; unsigned syze; {
- if ((int) (syze) < 0) error(Negative);
- if (bugs) printf("[%u]",syze);
- denote(*v);
- *v= myrealloc(*v, syze);
- note(*v);
- if (*v == Nil) memexh();
- }
-
- Visible Procedure freemem(p) ptr p; {
- denote(p);
- free(p);
- }
-
- #ifdef RESERVE
-
- #define RES_SIZE 3000
-
- Hidden char *p_reserve= Nil;
-
- Hidden Procedure initreserve() {
- p_reserve= malloc(RES_SIZE);
- }
-
- Hidden char *mymalloc(syze) unsigned syze; {
- char *p;
- p= malloc(syze);
- if (p != Nil && p_reserve != Nil) return p;
- if (p_reserve != Nil) {
- free(p_reserve); p_reserve= Nil;
- p= malloc(syze);
- if (p != Nil) error(MESS(602, "out of memory"));
- }
- if (p_reserve == Nil) initreserve();
- return p;
- }
-
- Hidden char *myrealloc(p1, syze) char *p1; unsigned syze; {
- char *p;
- p= realloc(p1, syze);
- if (p != Nil && p_reserve != Nil) return p;
- if (p_reserve != Nil) {
- free(p_reserve); p_reserve= Nil;
- p= realloc(p1, syze);
- if (p != Nil) error(MESS(602, "out of memory"));
- }
- if (p_reserve == Nil) initreserve();
- return p;
- }
-
- #endif RESERVE
-